package com.quan.common.utils.image;

import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import cn.hutool.core.codec.Base64;

public class ImageUtils {

	public static void main(String[] args) {
		System.out.println(getBase64ByImgUrl("http://www.jeecg.org/static/image/common/logo.png"));
	}
	
	/**
	 * 将字节转换为Base64，直接将数据放到img src中即可
	 * @param bytes
	 * @return
	 */
	public static String converterImageBase64(byte[] bytes) {
		return "data:image/png;base64," + Base64.encode(bytes);
		//return "data:image/png;base64," + Base64.getEncoder().encodeToString(bytes);
	}
	
	/**
	 * 将字节转换为Base64，直接将数据放到img src中即可
	 * @param bytes
	 * @return
	 */
	public static String converterImageBase64(String imageBase64) {
		return "data:image/png;base64," + imageBase64;
	}

	public static String getBase64ByImgUrl(String url) {
		String suffix = url.substring(url.lastIndexOf(".") + 1);
		try {
			URL urls = new URL(url);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			Image image = Toolkit.getDefaultToolkit().getImage(urls);
			BufferedImage biOut = toBufferedImage(image);
			ImageIO.write(biOut, suffix, baos);
			String base64Str = Base64Util.encode(baos.toByteArray());
			return base64Str;
		} catch (Exception e) {
			return "";
		}

	}

	public static BufferedImage toBufferedImage(Image image) {
		if (image instanceof BufferedImage) {
			return (BufferedImage) image;
		}
		image = new ImageIcon(image).getImage();
		BufferedImage bimage = null;
		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		try {
			int transparency = Transparency.OPAQUE;
			GraphicsDevice gs = ge.getDefaultScreenDevice();
			GraphicsConfiguration gc = gs.getDefaultConfiguration();
			bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
		} catch (HeadlessException e) {
		}
		if (bimage == null) {
			int type = BufferedImage.TYPE_INT_RGB;
			bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
		}
		Graphics g = bimage.createGraphics();
		g.drawImage(image, 0, 0, null);
		g.dispose();
		return bimage;
	}

	/**
	 * 通过图片的url获取图片的base64字符串
	 *
	 * @param imgUrl 图片url
	 * @return 返回图片base64的字符串
	 */
	public static String image2Base64(String imgUrl) {

		URL url = null;

		InputStream is = null;

		ByteArrayOutputStream outStream = null;

		HttpURLConnection httpUrl = null;

		try {

			url = new URL(imgUrl);

			httpUrl = (HttpURLConnection) url.openConnection();

			httpUrl.connect();

			httpUrl.getInputStream();

			is = httpUrl.getInputStream();

			outStream = new ByteArrayOutputStream();

			// 创建一个Buffer字符串

			byte[] buffer = new byte[1024];

			// 每次读取的字符串长度，如果为-1，代表全部读取完毕

			int len = 0;

			// 使用一个输入流从buffer里把数据读取出来

			while ((len = is.read(buffer)) != -1) {

				// 用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度

				outStream.write(buffer, 0, len);

			}

			// 对字节数组Base64编码

			return Base64Util.encode(outStream.toByteArray());

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			if (is != null)

			{

				try {

					is.close();

				} catch (IOException e) {

					e.printStackTrace();

				}

			}

			if (outStream != null)

			{

				try {

					outStream.close();

				} catch (IOException e) {

					e.printStackTrace();

				}

			}

			if (httpUrl != null)

			{

				httpUrl.disconnect();

			}

		}

		return imgUrl;

	}

	/**
	 * base64字符串去掉空格
	 *
	 * @param str 图片url
	 * @return 返回图片base64的字符串
	 */
	public static String replaceBlank(String str) {
		String dest = "";
		if (str != null) {
			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
			Matcher m = p.matcher(str);
			dest = m.replaceAll("");
		}
		return dest;
	}

	/**
	 * 通过网络url获取图片的base64字符串
	 *
	 * @param imgURL 图片url
	 * @return 返回图片base64的字符串
	 */
	public static String ImageToBase64ByOnline(String imgURL) {
		ByteArrayOutputStream data = new ByteArrayOutputStream();
		try {
			// 创建URL
			URL url = new URL(imgURL);
			byte[] by = new byte[1024];
			// 创建链接
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(10000);
			InputStream is = conn.getInputStream();
			// 将内容读取内存中
			int len = -1;
			while ((len = is.read(by)) != -1) {
				data.write(by, 0, len);
			}
			// 关闭流
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 对字节数组Base64编码
		
		return Base64.encode(data.toByteArray());
	}
}